home *** CD-ROM | disk | FTP | other *** search
/ Die Speccy' 97 / Die Speccy' 97.iso / amiga_system / the_aminet / comm / bbs / bbbbs85.lha / rexx / bbsUSER.rexx < prev    next >
OS/2 REXX Batch file  |  1994-11-18  |  10KB  |  365 lines

  1. /* $VER: bbsUSER.rexx 8.3 (18.11.94)
  2. counts upload/download statistics
  3. copyright 1990-94 Richard Lee Stockton 
  4.       - FREELY DISTRIBUTABLE -
  5. */
  6.  
  7. HOW_MANY=10
  8. CALL PRAGMA('P',-2)
  9. SIGNAL ON ERROR
  10. SIGNAL ON SYNTAX
  11. SIGNAL ON FAILURE
  12. NUMERIC DIGITS 14
  13.  
  14. CALL TIME('R')
  15. PARSE ARG inarg .
  16. test=COMPRESS(UPPER(inarg),' -')
  17. IF test='?' | test='H' | test='USAGE' | test='HELP' THEN
  18.   DO
  19.     SAY 'Usage: rx bbsUSER [filename or CLI]'
  20.     SAY
  21.     SAY 'CLI writes to the console.'
  22.     SAY 'If a filename or the letters CLI are not included,'
  23.     SAY 'writes to a file called Information/STATS.USER'
  24.   END
  25.  
  26. figarg='s:CONFIG.BBS'
  27. IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  28. x=OPEN(f,figarg,'R')
  29. IF x=0 THEN
  30.   DO
  31.     SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  32.     EXIT(20)
  33.   END
  34.  
  35. CALL SETCLIP('BBS_STAT','ON')
  36. lynes.=''
  37. DO i=1 TO 25
  38.   lynes.i=READLN(f)
  39. END
  40. CALL CLOSE(f)
  41.  
  42. compos=POS('/*',lynes.1)
  43. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  44.  
  45. bbsname = STRIP(lynes.1)
  46. sysop   = WORD(lynes.2,1)
  47. bbspath = WORD(lynes.6,1)
  48. IF ~EXISTS(bbspath) THEN
  49.   DO
  50.     SAY bbspath 'does not exist!'
  51.     CALL SETCLIP('BBS_STAT')
  52.     EXIT(20)
  53.   END
  54. testchar=RIGHT(bbspath,1)
  55. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  56. IF WORD(lunes.25,1)=1 THEN scratch=bbspath'Scratch'
  57. ELSE scratch='RAM:Scratch'
  58.  
  59. IF inarg='' THEN
  60.   DO
  61.     CALL CLOSE(STDOUT)
  62.     CALL OPEN(STDOUT,scratch'/bbsUSER.STDOUT','W')
  63.     SAY SUBSTR(SOURCELINE(1),10)
  64.   END
  65.  
  66. counts.=0
  67. DO j=1 TO HOW_MANY
  68.   counts.LOW.j=999999999
  69. END
  70. counts.AGE_YOUNGEST=99999999
  71. ten=0
  72. thirty=0
  73. ninty=0
  74. sixmo=0
  75. ndate=DATE('I')
  76. userlist=SHOWDIR(bbspath'Users','F')
  77. x=FIND(userlist,sysop)
  78. IF x>0 THEN userlist=DELWORD(userlist,x,1)
  79. DO i=1 TO WORDS(userlist)
  80.   thisuser=WORD(userlist,i)
  81.   x=OPEN(f,bbspath'Users/'thisuser,'R')
  82.   IF x=0 THEN
  83.     DO
  84.       SAY thisuser 'userfile would not open!'
  85.       ITERATE i
  86.     END
  87.   lynes.=''
  88.   DO j=1 TO 23
  89.     line=READLN(f)
  90.     IF EOF(f) THEN LEAVE j
  91.     lynes.j=line
  92.   END
  93.   CALL CLOSE(f)
  94.   IF j<23 THEN ITERATE i
  95.   callcount=WORD(lynes.19,6)
  96.   counts.CALLS=counts.CALLS+callcount
  97.   DO j=HOW_MANY TO 1 BY -1 WHILE callcount>counts.CALLS.j
  98.     jj=j+1
  99.     counts.CALLS.jj=counts.CALLS.j
  100.     counts.ID.CALLS.jj=counts.ID.CALLS.j
  101.     counts.CALLS.j=callcount
  102.     counts.ID.CALLS.j=thisuser
  103.   END
  104.   ontime=WORD(lynes.19,1)*60+WORD(lynes.19,3)
  105.   counts.MINUTES=counts.MINUTES+ontime
  106.   DO j=HOW_MANY TO 1 BY -1 WHILE ontime>counts.ON_MINS.j
  107.     jj=j+1
  108.     counts.ON_MINS.jj=counts.ON_MINS.j
  109.     counts.ID.ON_MINS.jj=counts.ID.ON_MINS.j
  110.     counts.ON_MINS.j=ontime
  111.     counts.ID.ON_MINS.j=thisuser
  112.   END
  113.   IF WORDS(lynes.12)>3 & DATATYPE(WORD(lynes.12,4),'N') THEN
  114.     DO
  115.       counts.AGE_INDEX=counts.AGE_INDEX+1
  116.       age=0
  117.       IF UPPER(WORD(lynes.12,3))='AGE:' THEN
  118.         DO
  119.           age=WORD(lynes.12,4)
  120.           counts.AGE_TOTAL=counts.AGE_TOTAL+age
  121.         END
  122.       ELSE IF UPPER(WORD(lynes.12,3))='BIRTHDAY:' THEN
  123.         DO
  124.           age=LEFT(DATE('S'),4)-LEFT(WORD(lynes.12,4),4)
  125.           counts.AGE_TOTAL=counts.AGE_TOTAL+age
  126.           IF SUBSTR(DATE('S'),5,2)<SUBSTR(WORD(lynes.12,4),5,2) THEN
  127.             DO
  128.               counts.AGE_TOTAL=counts.AGE_TOTAL-1
  129.               age=age-1
  130.             END
  131.         END
  132.       IF age>0 & age<counts.AGE_YOUNGEST THEN counts.AGE_YOUNGEST=age
  133.       IF age>counts.AGE_OLDEST THEN counts.AGE_OLDEST=age
  134.     END
  135.   idate=DATE('I',STRIP(WORD(lynes.13,1)),'S')
  136.   days=ndate-idate
  137.   IF days<11 THEN ten=ten+1
  138.   IF days<31 THEN thirty=thirty+1
  139.   IF days<91 THEN ninty=ninty+1
  140.   IF days<183 THEN sixmo=sixmo+1
  141.   upfiles=0
  142.   upbytes=1
  143.   dnfiles=0
  144.   dnbytes=1
  145.   IF WORDS(lynes.14)>3 THEN
  146.     DO
  147.       upfiles=WORD(lynes.14,1)
  148.       upbytes=WORD(lynes.14,3)
  149.     END
  150.   IF WORDS(lynes.15)>3 THEN
  151.     DO
  152.       dnfiles=WORD(lynes.15,1)
  153.       dnbytes=WORD(lynes.15,3)
  154.     END
  155.   IF upbytes<1 THEN upbytes=1
  156.   counts.UP_FILES=counts.UP_FILES+upfiles
  157.   counts.UP_BYTES=counts.UP_BYTES+upbytes
  158.   counts.DN_FILES=counts.DN_FILES+dnfiles
  159.   counts.DN_BYTES=counts.DN_BYTES+dnbytes
  160.   DO j=HOW_MANY TO 1 BY -1 WHILE upfiles>counts.HIGH.UP_FILES.j
  161.     jj=j+1
  162.     counts.HIGH.UP_FILES.jj=counts.HIGH.UP_FILES.j
  163.     counts.ID.UP_FILES.jj=counts.ID.UP_FILES.j
  164.     counts.HIGH.UP_FILES.j=upfiles
  165.     counts.ID.UP_FILES.j=thisuser
  166.   END
  167.   DO j=HOW_MANY TO 1 BY -1 WHILE upbytes>counts.HIGH.UP_BYTES.j
  168.     jj=j+1
  169.     counts.HIGH.UP_BYTES.jj=counts.HIGH.UP_BYTES.j
  170.     counts.ID.UP_BYTES.jj=counts.ID.UP_BYTES.j
  171.     counts.HIGH.UP_BYTES.j=upbytes
  172.     counts.ID.UP_BYTES.j=thisuser
  173.   END
  174.   DO j=HOW_MANY TO 1 BY -1 WHILE dnfiles>counts.HIGH.DN_FILES.j
  175.     jj=j+1
  176.     counts.HIGH.DN_FILES.jj=counts.HIGH.DN_FILES.j
  177.     counts.ID.DN_FILES.jj=counts.ID.DN_FILES.j
  178.     counts.HIGH.DN_FILES.j=dnfiles
  179.     counts.ID.DN_FILES.j=thisuser
  180.   END
  181.   DO j=HOW_MANY TO 1 BY -1 WHILE dnbytes>counts.HIGH.DN_BYTES.j
  182.     jj=j+1
  183.     counts.HIGH.DN_BYTES.jj=counts.HIGH.DN_BYTES.j
  184.     counts.ID.DN_BYTES.jj=counts.ID.DN_BYTES.j
  185.     counts.HIGH.DN_BYTES.j=dnbytes
  186.     counts.ID.DN_BYTES.j=thisuser
  187.   END
  188.   IF (dnbytes=1)&(upbytes=1) THEN NOP
  189.   ELSE
  190.     DO j=HOW_MANY TO 1 BY -1 WHILE (dnbytes/upbytes)<counts.LOW.j
  191.       jj=j+1
  192.       counts.LOW.jj=counts.LOW.j
  193.       counts.ID.LOW.jj=counts.ID.LOW.j
  194.       counts.LOW.j=dnbytes/upbytes
  195.       counts.ID.LOW.j=thisuser
  196.     END
  197.   DO j=HOW_MANY TO 1 BY -1 WHILE (dnbytes/upbytes)>counts.HIGH.j
  198.     jj=j+1
  199.     counts.HIGH.jj=counts.HIGH.j
  200.     counts.ID.HIGH.jj=counts.ID.HIGH.j
  201.     counts.HIGH.j=dnbytes/upbytes
  202.     counts.ID.HIGH.j=thisuser
  203.   END
  204.   totwrit=0
  205.   DO j=1 TO 99
  206.     thisnum=WORD(lynes.23,j)
  207.     IF DATATYPE(thisnum,'N') THEN totwrit=totwrit+thisnum
  208.   END
  209.   DO j=HOW_MANY TO 1 BY -1 WHILE totwrit>counts.HIGH.MSGS.j
  210.     jj=j+1
  211.     counts.HIGH.MSGS.jj=counts.HIGH.MSGS.j
  212.     counts.ID.MSGS.jj=counts.ID.MSGS.j
  213.     counts.HIGH.MSGS.j=totwrit
  214.     counts.ID.MSGS.j=thisuser
  215.   END
  216. END
  217.  
  218.  
  219. /* OUTPUT */
  220.  
  221. IF inarg='' THEN inarg=bbspath'Information/STATS.USER'
  222. IF UPPER(inarg)~='CLI' THEN
  223.   DO
  224.     CALL CLOSE(STDOUT)
  225.     CALL OPEN(STDOUT,inarg,'W')
  226.     IF x=0 THEN
  227.       DO
  228.         SAY inarg 'would not open for writing!'
  229.         CALL SETCLIP('BBS_STAT')
  230.         EXIT(20)
  231.       END
  232.   END
  233.  
  234. SAY LEFT('-',75,'-')
  235. SAY CENTER(bbsname 'USER statistics through' DATE() 'at' TIME('C'),75)
  236. SAY LEFT('-',75,'-')
  237. SAY CENTER('Does not include sysop.',75)
  238. SAY LEFT('-',75,'-')
  239. SAY
  240. IF counts.AGE_INDEX>0 THEN
  241.   SAY CENTER('Of' WORDS(userlist) 'total users,' counts.AGE_INDEX 'gave their ages.',75)
  242.   SAY CENTER('The youngest is' counts.AGE_YOUNGEST'    The oldest is' counts.AGE_OLDEST'    The average is' TRUNC(counts.AGE_TOTAL/counts.AGE_INDEX+.005,2),75)
  243. SAY
  244. SAY RIGHT(comma(counts.UP_BYTES),15) 'bytes in' RIGHT(comma(counts.UP_FILES),7) 'files have been uploaded by these users.'
  245. SAY RIGHT(comma(counts.DN_BYTES),15) 'bytes in' RIGHT(comma(counts.DN_FILES),7) 'files have been downloaded by these users.'
  246. SAY
  247. SAY
  248. SAY 'Most public  messages:' RIGHT(comma(counts.HIGH.MSGS.1),14) counts.ID.MSGS.1
  249. DO j=2 TO HOW_MANY
  250.   IF counts.HIGH.MSGS.j>0 THEN
  251.     SAY RIGHT(comma(counts.HIGH.MSGS.j),37) counts.ID.MSGS.j
  252. END
  253. SAY
  254. SAY 'Most files   uploaded:' RIGHT(comma(counts.HIGH.UP_FILES.1),14) counts.ID.UP_FILES.1
  255. DO j=2 TO HOW_MANY
  256.   IF counts.HIGH.UP_FILES.j>0 THEN
  257.     SAY RIGHT(comma(counts.HIGH.UP_FILES.j),37) counts.ID.UP_FILES.j
  258. END
  259. SAY
  260. SAY 'Most bytes   uploaded:' RIGHT(comma(counts.HIGH.UP_BYTES.1),14) counts.ID.UP_BYTES.1
  261. DO j=2 TO HOW_MANY
  262.   IF counts.HIGH.UP_BYTES.j>0 THEN
  263.     SAY RIGHT(comma(counts.HIGH.UP_BYTES.j),37) counts.ID.UP_BYTES.j
  264. END
  265. SAY
  266. SAY 'Most files downloaded:' RIGHT(comma(counts.HIGH.DN_FILES.1),14) counts.ID.DN_FILES.1
  267. DO j=2 TO HOW_MANY
  268.   IF counts.HIGH.DN_FILES.j>0 THEN
  269.     SAY RIGHT(comma(counts.HIGH.DN_FILES.j),37) counts.ID.DN_FILES.j
  270. END
  271. SAY
  272. SAY 'Most bytes downloaded:' RIGHT(comma(counts.HIGH.DN_BYTES.1),14) counts.ID.DN_BYTES.1
  273. DO j=2 TO HOW_MANY
  274.   IF counts.HIGH.DN_BYTES.j>0 THEN
  275.     SAY RIGHT(comma(counts.HIGH.DN_BYTES.j),37) counts.ID.DN_BYTES.j
  276. END
  277. SAY
  278. SAY
  279. SAY 'Best  (lowest)  ratio, downloads divided by uploads:'
  280. DO j=1 TO HOW_MANY
  281.   IF counts.LOW.j<999999999 THEN
  282.     SAY RIGHT(comma(counts.LOW.j%1)||RIGHT(TRUNC(counts.LOW.j+.000005,5),6),37) counts.ID.LOW.j
  283. END
  284. SAY
  285. SAY 'Worst (highest) ratio, downloads divided by uploads:'
  286. DO j=1 TO HOW_MANY
  287.   IF counts.HIGH.j>0 THEN
  288.     SAY RIGHT(comma(counts.HIGH.j%1),37) counts.ID.HIGH.j
  289. END
  290. SAY
  291. SAY 'Most Calls To' bbsname':'
  292. DO j=1 TO HOW_MANY
  293.   IF counts.CALLS.j>0 THEN
  294.     SAY RIGHT(comma(counts.CALLS.j%1),37) counts.ID.CALLS.j
  295. END
  296. SAY
  297. SAY 'Most Time Spent On' bbsname':'
  298. DO j=1 TO HOW_MANY
  299.   IF counts.ON_MINS.j>0 THEN
  300.     DO
  301.       temp=comma(counts.ON_MINS.j%60) 'hours'
  302.       temp2=counts.ON_MINS.j//60
  303.       IF temp2<10 THEN temp2='0'temp2
  304.       temp=RIGHT(temp temp2 'minutes',37)
  305.       SAY temp counts.ID.ON_MINS.j
  306.     END
  307. END
  308. SAY
  309. SAY RIGHT(comma(counts.MINUTES),37) 'minutes.'
  310. SAY RIGHT(comma(counts.CALLS),37) 'calls.'
  311. SAY RIGHT('----------',39)
  312. SAY RIGHT(TRUNC(.05+counts.MINUTES/counts.CALLS,1),39) 'minutes per call.'
  313. SAY
  314. users=WORDS(userlist)
  315. SAY RIGHT(comma(users),7) 'users.'
  316. SAY RIGHT(comma(sixmo),7)',' RIGHT(((sixmo*100)/users)%1,2)'%, have called in the last 6 months.'
  317. SAY RIGHT(comma(ninty),7)',' RIGHT(((ninty*100)/users)%1,2)'%, have called in the last 90 days.'
  318. SAY RIGHT(comma(thirty),7)',' RIGHT(((thirty*100)/users)%1,2)'%, have called in the last 30 days.'
  319. SAY RIGHT(comma(ten),7)',' RIGHT(((ten*100)/users)%1,2)'%, have called in the last 10 days.'
  320. SAY
  321. t=(.5+TIME('E'))%1
  322. min=t%60
  323. hrs=min%60
  324. min=min//60
  325. sec=t//60
  326. temp=' - It took'
  327. IF hrs>1 THEN temp=temp hrs 'hours'
  328. ELSE IF hrs=1 THEN temp=temp '1 hour'
  329. IF min>1 THEN temp=temp min 'minutes'
  330. ELSE IF min=1 THEN temp=temp '1 minute'
  331. temp=temp sec 'seconds to compile this report. -'
  332. SAY temp
  333. SAY
  334. CALL SETCLIP('BBS_STAT')
  335. EXIT;
  336.  
  337.  
  338. comma: PROCEDURE
  339. ARG num .
  340. dgt=LENGTH(num)
  341. numtext=''
  342. IF dgt>3 THEN numtext=','RIGHT(num,3)
  343. IF dgt>6 THEN numtext=','LEFT(RIGHT(num,6),3)||numtext
  344. IF dgt>9 THEN
  345.   DO
  346.     numtext=','LEFT(RIGHT(num,9),3)||numtext
  347.     numtext=LEFT(num,dgt-9)||numtext
  348.   END
  349. ELSE IF dgt>6 THEN numtext=LEFT(num,dgt-6)||numtext
  350. ELSE IF dgt>3 THEN numtext=LEFT(num,dgt-3)||numtext
  351. ELSE numtext=num
  352. RETURN(numtext)
  353.  
  354.  
  355. SYNTAX:
  356. FAILURE:
  357. ERROR:
  358. SAY 'Line:' SIGL ERRORTEXT(RC)
  359. SAY thisuser
  360. SAY
  361. CALL SETCLIP('BBS_STAT')
  362. EXIT;
  363.  
  364. /* end of bbsUSER.rexx */
  365.